﻿#pragma once

#include "../graphic/BaseGraphicView.h"

#include <boost/signal.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
#include "../graphic/DeductionView.h"
#include "../../helpers/graphic/deduction/DeductedCardsDialog.h"
#include "../../../utils/gui/Form.h"
#include "../../../domain/models/CardSet.h"
#include "../../../domain/models/Player.h"
#include "../../../domain/network/GameClient.h"

namespace Views {
	namespace Remote {
		class DeductionView: public Graphic::DeductionView
		{
			Domain::Network::GameClient* client; /**< Klient gracza */
			Cards::CardsCollection cards; /**< Wszystkie karty w grze */
			Utils::GUI::Control* CardInfo; /**< Kontrolka z informacją o pokazaniu karty */

		public:
			/**
			* @param form Główna formatka aplikacji
			* @param game_client Połączony z serwerem klient gry
			* @param cards Karty w grze
			*/
			DeductionView(Utils::GUI::Form*, Domain::Network::GameClient*, Cards::CardsCollection);

			/**
			* Rozpoczyna oczekiwanie na otrzymanie od serwera szukanych kart
			*/
			virtual void openPickSearchedCardsDialog(Players::Player*, Cards::PlayersCards, Cards::WeaponsCards);
			virtual void openPickCardDialog(Players::Player*, Cards::CardSet&);

			/**
			* Pokazuje informację, który gracz pokazał kartę
			*/
			virtual void showDeductedCard(Cards::Card* card, Players::Player* current_player, Players::Player* card_owner);
			/**
			* Pokazuje informację o nie znalezieniu żadnej karty
			*/
			virtual void showNoCardsDeducted(Cards::CardSet& cards, Players::Player* player);

		protected:
			/**
			* Funkcja odbierająca od serwera dane o kartach w podejrzeniu
			* @param packet Pakiet zawierający karty
			*/
			virtual void onSearchedCardsPick(sf::Packet packet);
			/**
			* Funkcja odbierająca od serwera dane o karcie wybranej przez gracza posiadającego więcej niż 1 kartę
			* spośród tych w oskarżeniu
			* @param packet Pakiet zawierający dane tej karty
			*/
			virtual void onDeductedCardPick(sf::Packet packet);

			/**
			* Wysyła do serwera informację o znalezionej karcie i wywołuje funkcję z klasy nadrzędnej
			*/
			virtual void onDeductedCardPick(Cards::Card* card);
			/**
			* Funkcja odbierająca od serwera informację o zamknięciu przez gracza, który przedstawił oskarżenie,
			* okienka dialogowego ze znalezioną kartą (lub informacją o braku znalezionych kart)
			* @param packet Pusty pakiet
			*/
			virtual void onDeductedCardsDialogClose(sf::Packet);
		};
	}
}

